# 从 sqlalchemy 模块导入 func 函数，用于在数据库查询中使用函数，如获取当前时间
from sqlalchemy import func
# 从 app.models 包中导入 db 对象，它通常是 SQLAlchemy 的数据库实例
from app.models import db
# 从 werkzeug.security 模块导入生成密码哈希和检查密码哈希的函数
from werkzeug.security import generate_password_hash, check_password_hash


def isAvailable(account):
    """
    检查指定账户是否可用（即是否已存在于数据库中）
    :param account: 要检查的账户名
    """
    # 尝试从数据库中查询具有指定账户名的乘客记录
    Passenger.query.filter_by(account=account).first()

class Passenger(db.Model):
    """
    Passenger 类表示数据库中的乘客表，继承自 SQLAlchemy 的 db.Model
    """
    __tablename__ = 'passenger'

    # 定义主键列，存储乘客的唯一标识
    id = db.Column(db.Integer, primary_key=True)
    # 定义存储乘客姓名的列，最大长度为 120
    name = db.Column(db.String(120))
    # 定义存储乘客账户名的列，唯一且不能为空，添加索引以提高查询效率
    account = db.Column(db.String(120), unique=True, nullable=False, index=True)
    # 定义存储密码哈希值的列，最大长度为 2000
    password_digest = db.Column(db.String(2000), nullable=False)
    # 定义存储乘客身份证号的列，最大长度为 120
    id_card_no = db.Column(db.String(120))
    # 定义存储乘客手机号码的列，最大长度为 120
    mobile_no = db.Column(db.String(120))
    # 定义存储乘客银行卡号的列，最大长度为 120
    bank_card_no = db.Column(db.String(120))
    # 定义存储乘客状态的列，默认为 0
    state = db.Column(db.Integer, default=0)
    # 定义存储乘客会员类型的列
    member_type = db.Column(db.Integer)
    # 定义存储乘客最后登录时间的列
    last_login_time = db.Column(db.DateTime)
    # 定义存储乘客记录创建时间的列，默认值为当前时间
    created_at = db.Column(db.DateTime, default=func.now())
    # 定义存储乘客记录更新时间的列，默认值为当前时间
    updated_at = db.Column(db.DateTime, default=func.now())

    def check_password(self, password):
        """
        验证传入的密码是否与存储的密码哈希值匹配

        :param password: 要验证的明文密码
        :return: 如果匹配返回 True，否则返回 False
        """
        return check_password_hash(self.password_digest, password)  # 验证密码

    @classmethod
    def verifyPassenger(cls, account, password):
        """
        根据账户名和密码验证乘客信息

        :param account: 要验证的账户名
        :param password: 要验证的密码
        :return: 如果验证成功返回乘客对象，否则返回 None
        """
        # 从数据库中查询具有指定账户名的乘客记录
        passenger = cls.query.filter_by(account=account).first()
        # 检查乘客记录是否存在且密码是否匹配
        if passenger and passenger.check_password(password):
            return passenger
        return None

    @classmethod
    def create(cls, data):
        """
        根据传入的数据创建新的乘客记录

        :param data: 包含乘客信息的字典，如账户名、密码等
        :return: 创建成功的乘客对象
        """
        # 创建新的乘客对象
        passenger = cls(
            account=data.get('account'),
            # 生成密码的哈希值
            password_digest=generate_password_hash(data.get('password')),
            name=data.get('name'),
            id_card_no=data.get('idCardNo'),
            mobile_no=data.get('mobileNo'),
            bank_card_no=data.get('bankCard'),
        )
        # 将新的乘客对象添加到数据库会话中
        db.session.add(passenger)
        # 提交数据库会话，将更改保存到数据库
        db.session.commit()
        return passenger

    @classmethod
    def destroy(cls, passenger_id):
        """
        根据乘客 ID 删除对应的乘客记录

        :param passenger_id: 要删除的乘客的 ID
        :return: 如果删除成功返回 True，否则返回 False
        """
        # 从数据库中查询具有指定 ID 的乘客记录
        passenger = cls.query.get(passenger_id)
        if passenger:
            # 如果记录存在，从数据库会话中删除该记录
            db.session.delete(passenger)
            # 提交数据库会话，将更改保存到数据库
            db.session.commit()
            return True
        return False
